package com.aspire.wap.core.common;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.regex.Pattern;

import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.apache.commons.lang3.time.DateUtils;
import org.apache.log4j.Logger;

/**
 * 这个类 <code>DateUtil</code> 集成了WAP组内常用的日期操作方法，在WAP项目的开发中。
 * <p>
 * @author  yuanming
 * @author  jianzhengmei
 * @author  XXX3
 * @version 1.80, 05/18/04
 * @see     java.text.DateFormat
 * @see     java.util.Calendar
 * @see     java.util.TimeZone
 * @since   JDK1.5
 */

public class DateUtil 
{
    private static final Logger log = Logger.getLogger(DateUtil.class);
    
    /** 日期格式为yyyy-MM-dd HH:mm:ss */
    public static final String DATA_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
    
    /** 日期格式为yyyyMMddHHmmss */
    public static final String DATA_TIME_FORMAT2 = "yyyyMMddHHmmss";
    
    /** 日期格式为yyyy-MM-dd*/
    public static final String DATA_FORMAT = "yyyy-MM-dd";
    
    /** 日期格式为yyyyMMdd*/
    public static final String DATA_FORMAT2 = "yyyyMMdd";
    
    /** 日期格式为yyyy年MM月dd日*/
    public static final String DATA_FORMAT3 = "yyyy年MM月dd日";
    
    
    /**
     *将yyyy-MM-dd hh:mm:ss字符串转换成日期。
     * @param str 格式为：“yyyy-MM-dd hh:mm:ss”
     * @return 解析出错将输出异常日志，并返回null
     */
    public static Date string2Date(String str)
    {
        return string2Date(str, DateUtil.DATA_TIME_FORMAT);
    }
    
    /**
     * 将指定格式的字符串转换成日期。
     * @param str    日期字符串
     * @param format 日期格式，常见的格式请参照静态成员变量。
     *              DATA_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss"
     *              DATA_TIME_FORMAT2 = "yyyyMMddHHmmss"
     *              DATA_FORMAT = "yyyy-MM-dd"
     *              DATA_FORMAT2 = "yyyyMMdd"
     *              DATA_FORMAT3 = "yyyy年MM月dd日"
     * @return Date  解析出错将输出异常日志，并返回null
     * @author  jianzhengmei
     */
    public static Date string2Date(String str, String format)
    {
        Date returnDate = null;
        
        if (StringUtils.isBlank(str) || StringUtils.isBlank(format))
        {
            log.error("The param cannot be empty, str=" + str + ", format=" + format);
        }
        else
        {
            SimpleDateFormat dateFormate = new SimpleDateFormat(format);
            try
            {
                returnDate = dateFormate.parse(str);
            }
            catch (ParseException e)
            {
                log.error("ParseException", e);
            }
        }

        return returnDate;
    }

    /**
     * 将日期转换成yyyy-MM-dd hh:mm:ss格式的字符串。
     * @param date 日期
     * @return String
     * @author  jianzhengmei
     */
    public static String date2String(Date date)
    {
        return date2String(date, DateUtil.DATA_TIME_FORMAT);
    }
    
    /**
     * 将日期转换成指定格式的字符串。
     * @param date 日期
     * @param format 日期格式，常见的格式请参照静态成员变量。
     *              DATA_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss"
     *              DATA_TIME_FORMAT2 = "yyyyMMddHHmmss"
     *              DATA_FORMAT = "yyyy-MM-dd"
     *              DATA_FORMAT2 = "yyyyMMdd"
     *              DATA_FORMAT3 = "yyyy年MM月dd日"
     * @return String
     * @author  jianzhengmei
     */
    public static String date2String(Date date, String format)
    {
        String returnStr = null;

        if (date != null)
        {
        	returnStr = DateFormatUtils.format(date, format);
        }

        return returnStr;
    }
    
    
    /**
     * 检查日期字符串合法性，仅针对我们能够识别的几种格式
     *     yyyy-MM-dd，yyyyMMdd，yyyy年MM月dd日
     *     其它格式请直接调用：
     *     isValidDate(String year, String month, String day) 
     * @param   dateString   日期字符串.
     * @author  jianzhengmei
     */
    public static boolean isValidDate(String dateString)
    {
        boolean valid = false;
        if ( StringUtils.isBlank(dateString))
        {
            return valid;
        }
        
        //格式：yyyyMMdd
        if (Pattern.matches("\\d{8}", dateString)) 
        {
            valid = isValidDate(dateString.substring(0,4),
                    dateString.substring(4,6), dateString.substring(6,8));
        }
        //格式：yyyy-MM-dd 或 yyyy年MM月dd日
        else if (Pattern.matches("\\d{4}-\\d{2}-\\d{2}", dateString)
            || Pattern.matches("\\d{4}年\\d{2}月\\d{2}日", dateString))
        {
            valid = isValidDate(dateString.substring(0,4),
                    dateString.substring(5,7), dateString.substring(8,10));
        }  
        else
        {
            valid = false;
        }
        
        return valid;
    }
    
    /**
     * 判断是否为合法日期。
     * @param year 
     * @param month 
     * @param day 
     * @return boolean
     * @author jianzhengmei
     */
    public static boolean isValidDate(String year, String month, String day)
    {
        boolean b_format = false;
        
        int i_year = 0;
        int i_month = 0;
        int i_day = 0;
        try
        {
            i_year = Integer.parseInt(year);
            i_month = Integer.parseInt(month);
            i_day = Integer.parseInt(day);
        }
        catch (Exception e)
        {
            log.error("parseInt error", e);
            return b_format;
        }

        if (i_year >= 1 && i_month >= 1 && i_month <= 12 && i_day >= 1
                && i_day <= 31)
        {            
            boolean b_leapyear = isLeapYear(i_year);
            if (i_month == 4 || i_month == 6 || i_month == 9 || i_month == 11)
            {
                if (i_day <= 30)
                {
                    b_format = true;
                }
            }
            else if (i_month == 2)
            {
                if (b_leapyear && i_day <= 29)
                {
                    b_format = true;
                }
                if (!b_leapyear && i_day <= 28)
                {
                    b_format = true;
                }
            }
            else
            {
                b_format = true;
            }
        }
        return b_format;
    }
    
    /**
     * 根据公历年份判断是否为闰年
     * @param year 年份
     * @return boolean
     * @author  jianzhengmei
     */
    public static boolean isLeapYear(int year)
    {      
        if (year % 4 == 0)
        {
            if (year % 100 == 0)
            {
                if (year % 400 == 0)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            else
            {
                return true;
            }
        }
        else
        {
            return false;
        }
    }

    /**
     * 计算两个时间对象的间隔
     * date1-date2，返回间隔单位为秒，如date1-date2<0，则返回负值
     *
     * @param   date1   起始时间.
     * @param   date2   终止时间.
     * @author  yuanming
     */
	public static long intervalDate( Date date1, Date date2 ){
		if(date1==null||date2==null){
			return 0;
		}else{
			return (date1.getTime()-date2.getTime())/DateUtils.MILLIS_PER_SECOND;
		}
	}
	
    /**
     * 通过对某个日期进行加减操作计算新时间
     * <p>根据传递的类型对相应的值进行计算.</p>
     *
     * @param   date   时间对象.
     * @param   type   值分别代表的意思。1=年,2=月,3=日,4=时,5=分,6=秒
     * @param   count  数量.
     * @author  wangxinning
     */
	public static Date calDate( Date date, int type, int amount ){
		//若传的日期为空，则返回空
		if(date == null)return null;
		//若增加的值为０；则直接返回传递的日期
		if(amount == 0)return date;
		//获取日期计算对象
		switch(type){
		case 1:
			return DateUtils.addYears(date, amount);
		case 2:
			return DateUtils.addMonths(date, amount);			
		case 3:
			return DateUtils.addDays(date, amount);
		case 4:
			return DateUtils.addHours(date, amount);
		case 5:
			return DateUtils.addMinutes(date, amount);
		case 6:
			return DateUtils.addSeconds(date, amount);
		default :
			return null;
		}
	}   

}
